]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
swipe-scrolling: Take threshold into account during drag
authorFlorian Müllner <fmuellner@gnome.org>
Mon, 24 Jan 2011 22:15:33 +0000 (23:15 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Tue, 25 Jan 2011 09:31:52 +0000 (10:31 +0100)
On button-release, a threshold is used to determine if the gesture
should be considered a click and thus ignored. While the drag is
active though, the controlled actor is dragged immediately. As a
result, dragging by a tiny amount does not trigger a snap back when
the action is interpreted as a click. As a fix, do not update the
dragged actor's position until the same threshold is passed.

https://bugzilla.gnome.org/show_bug.cgi?id=640494

js/ui/overview.js

index c4b0c4ec0895ce9d9f13df5bc5404f611eb16863..513d93baf1301e173f007be10fb520e02dc65a5c 100644 (file)
@@ -276,6 +276,8 @@ Overview.prototype = {
 
     _onCapturedEvent: function(actor, event) {
         let stageX, stageY;
+        let threshold = Gtk.Settings.get_default().gtk_dnd_drag_threshold;
+
         switch(event.type()) {
             case Clutter.EventType.BUTTON_RELEASE:
                 [stageX, stageY] = event.get_coords();
@@ -328,7 +330,6 @@ Overview.prototype = {
 
                 // See if the user has moved the mouse enough to trigger
                 // a drag
-                let threshold = Gtk.Settings.get_default().gtk_dnd_drag_threshold;
                 if (Math.abs(stageX - this._dragStartX) < threshold &&
                     Math.abs(stageY - this._dragStartY) < threshold) {
                     // no motion? It's a click!
@@ -371,6 +372,16 @@ Overview.prototype = {
                 let dy = this._dragY - stageY;
                 let primary = global.get_primary_monitor();
 
+                this._dragX = stageX;
+                this._dragY = stageY;
+                this._lastMotionTime = event.get_time();
+
+                // See if the user has moved the mouse enough to trigger
+                // a drag
+                if (Math.abs(stageX - this._dragStartX) < threshold &&
+                    Math.abs(stageY - this._dragStartY) < threshold)
+                    return true;
+
                 if (this._scrollDirection == SwipeScrollDirection.HORIZONTAL) {
                     if (St.Widget.get_default_direction() == St.TextDirection.RTL)
                         this._scrollAdjustment.value -= (dx / primary.width) * this._scrollAdjustment.page_size;
@@ -380,10 +391,6 @@ Overview.prototype = {
                     this._scrollAdjustment.value += (dy / primary.height) * this._scrollAdjustment.page_size;
                 }
 
-                this._dragX = stageX;
-                this._dragY = stageY;
-                this._lastMotionTime = event.get_time();
-
                 return true;
 
             // Block enter/leave events to avoid prelights